package com.efast.cafe.framework.jdbc;

import java.util.List;
import java.util.Map;

import com.efast.cafe.framework.jdbc.bean.DBColumn;
import com.efast.cafe.framework.jdbc.bean.DBTable;
import com.efast.cafe.framework.jdbc.persistence.Criteria;
import com.efast.cafe.framework.pager.Pagination;


/**
 * jdbc操作dao
 */
public interface JdbcDao {

	/**
	 * 插入一条记录 自动处理主键
	 *
	 * @param entity
	 * @return
	 */
	public Long insert(Object entity);

	/**
	 * 插入一条记录 自动处理主键
	 *
	 * @param criteria
	 *            the criteria
	 * @return long long
	 */
	public Long insert(Criteria criteria);

	/**
	 * 保存一条记录，不处理主键
	 *
	 * @param entity
	 */
	public void save(Object entity);

	/**
	 * 保存一条记录，不处理主键
	 *
	 * @param criteria
	 *            the criteria
	 */
	public void save(Criteria criteria);

	/**
	 * 根据Criteria更新
	 *
	 * @param criteria
	 *            the criteria
	 */
	public void update(Criteria criteria);

	/**
	 * 根据实体更新
	 *
	 * @param entity
	 *            the entity
	 */
	public void update(Object entity);

	/**
	 * 根据Criteria删除
	 *
	 * @param criteria
	 *            the criteria
	 */
	public void delete(Criteria criteria);

	/**
	 * 删除记录 此方法会以实体中不为空的字段为条件
	 *
	 * @param entity
	 */
	public void delete(Object entity);

	/**
	 * 删除记录
	 *
	 * @param clazz
	 *            the clazz
	 * @param id
	 *            the id
	 */
	public void delete(Class<?> clazz, Long id);

	/**
	 * 删除所有记录(TRUNCATE ddl权限)
	 *
	 * @param clazz
	 *            the clazz
	 */
	public void deleteAll(Class<?> clazz);

	/**
	 * 按设置的条件查询
	 *
	 * @param <T>
	 *            the type parameter
	 * @param criteria
	 *            the criteria
	 * @return list
	 */
	public <T> List<T> queryList(Criteria criteria);

	/**
	 * 查询列表
	 *
	 * @param entity
	 *            the entity
	 * @return the list
	 */
	public <T> List<T> queryList(T entity);

	/**
	 * 查询列表
	 *
	 * @param <T>
	 *            the type parameter
	 * @param entity
	 *            the entity
	 * @param criteria
	 *            the criteria
	 * @return the list
	 */
	public <T> List<T> queryList(T entity, Criteria criteria);

	/**
	 * 查询记录数
	 *
	 * @param entity
	 * @return
	 */
	public int queryCount(Object entity);

	public int queryCount(String sql);

	public int queryCount(String sql, Object[] params);

	/**
	 * 查询记录数
	 *
	 * @param criteria
	 *            the criteria
	 * @return int int
	 */
	public int queryCount(Criteria criteria);

	/**
	 * 查询记录数
	 *
	 * @param entity
	 *            the entity
	 * @param criteria
	 *            the criteria
	 * @return int int
	 */
	public int queryCount(Object entity, Criteria criteria);

	/**
	 * 根据主键得到记录
	 *
	 * @param <T>
	 *            the type parameter
	 * @param clazz
	 *            the clazz
	 * @param id
	 *            the id
	 * @return t
	 */
	public <T> T get(Class<T> clazz, Long id);

	/**
	 * 根据主键得到记录
	 *
	 * @param <T>
	 *            the type parameter
	 * @param criteria
	 *            the criteria
	 * @param id
	 *            the id
	 * @return t
	 */
	public <T> T get(Criteria criteria, Long id);

	/**
	 * 查询单个记录
	 *
	 * @param <T>
	 *            the type parameter
	 * @param entity
	 *            the entity
	 * @return t t
	 */
	public <T> T querySingleResult(T entity);

	/**
	 * 查询单个记录
	 *
	 * @param <T>
	 *            the type parameter
	 * @param criteria
	 *            the criteria
	 * @return t t
	 */
	public <T> T querySingleResult(Criteria criteria);

	/**
	 * 分页查询
	 * 
	 * @param page
	 *            分页对象
	 * @param criteria
	 * @return
	 */
	public <T> Pagination<T> queryListByPage(Pagination<T> page, Criteria criteria);

	/**
	 * 分页查询
	 * 
	 * @param page
	 *            分页对象
	 * @param entity
	 * @return
	 */
	public <T> Pagination<T> queryListByPage(Pagination<T> page, T entity);

	/**
	 * 分页查询
	 * 
	 * @param page
	 *            分页对象
	 * @param sql
	 * @return
	 */
	public <T> Pagination<T> queryListByPage(Pagination<T> page, String sql, List<Object> params, Class<T> clazz);

	/**
	 * 分页查询
	 * 
	 * @param page
	 *            分页对象
	 * @param sql
	 * @return
	 */
	public List<Map<String, Object>> queryMapListByPage(Integer page, Integer pageSize, String sql,
			List<Object> params);

	/**
	 * 查询blob字段值
	 *
	 * @param clazz
	 * @param fieldName
	 * @param id
	 * @return
	 */
	public byte[] getBlobValue(Class<?> clazz, String fieldName, Long id);

	/**
	 * 根据sql语句查询
	 * 
	 * @param params
	 *            sql语句的参数
	 * @param entity
	 *            转换的对象
	 * @return
	 */
	public <T> List<T> queryBySQL(String sql, Object[] params, Class<T> clazz);

	/**
	 * 根据sql语句查询
	 * 
	 * @param params
	 *            sql语句的阐述
	 * @param entity
	 *            转换的对象
	 * @return
	 */
	public <T> List<T> queryBySQL(String sql, List<Object> params, Class<T> clazz);

	/**
	 * 根据sql语句查询
	 * 
	 * @param entity
	 *            转换的对象
	 * @return
	 */
	public <T> List<T> queryBySQL(String sql, Class<T> clazz);

	/**
	 * 根据sql语句查询单个对象
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public <T> T queryBySqlForObject(String sql, Class<T> clazz);

	/**
	 * 根据sql语句查询单个对象
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public <T> T queryBySqlForObject(String sql, Object[] params, Class<T> clazz);

	/**
	 * 根据sql语句查询单个对象
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public <T> T queryBySqlForObject(String sql, List<Object> params, Class<T> clazz);

	/**
	 * sql查询列表 返回 List<Map> Map的key为表的字段名
	 * 
	 * @param sql
	 * @return
	 */
	public List<Map<String, Object>> queryForListMap(String sql);

	/**
	 * sql查询列表 返回 List<Map> Map的key为表的字段名
	 * 
	 * @param sql
	 * @return
	 */
	public List<Map<String, Object>> queryForListMap(String sql, List<Object> params);

	/**
	 * sql查询列表 返回 List<Map> Map的key为表的字段名
	 * 
	 * @param sql
	 * @return
	 */
	public List<Map<String, Object>> queryForListMap(String sql, Object[] params);

	/**
	 * 查询列表 返回 List<Map> Map的key为表的字段名
	 * 
	 * @param sql
	 * @return
	 */
	public List<Map<String, Object>> queryForListMap(Criteria criteria);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 */
	public void executeBySQL(String sql);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 */
	public void executeBySQL(String sql, Object[] params);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 */
	public void executeBySQL(String sql, List<Object> params);
	
	public Integer insertBySQLAndGetKey(String sql, List<Object> params);

	/**
	 * 批量执行sql(插入或修改) sql语句是一个 参数是N条
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public int[] executeBatchBySQL(final String sql, final List<List<Object>> params);

	/**
	 * 调用存储过程获取系统唯一编码
	 * 
	 * @return
	 */
	public String executeProcGetCode(String code, String companyCode);

	/**
	 * 查询当期链接的所有表信息
	 * 
	 * @return List<DBTable>
	 * @Author Administrator
	 * @Date 2017年11月30日
	 */
	public List<DBTable> getDataBaseTables();

	/**
	 * 查询数据库列信息
	 * @param tableName
	 * @return String
	 * @Author Administrator
	 * @Date 2017年12月1日
	 */
	public List<DBColumn> getColumns(String tableName);
	
	public List<Map<String, Object>> queryForListMapBySql(String sql);
	
	public Long insertAndGetKey(String sql , List<Object> objects);
}
